package com.itheima.d5_generics;

import com.itheima.test.T;
import lombok.Data;

import java.util.ArrayList;

/*
    1 泛型
         定义类、接口、方法时，同时声明了一个或者多个类型变量（如：<E>） ，称为泛型类、泛型接口，泛型方法、它们统称为泛型。
    2 作用：泛型提供了在编译阶段约束所能操作的数据类型，并自动进行检查的能力！这样可以避免强制类型转换，及其可能出现的异常。
    3 泛型的本质：把具体的数据类型作为参数传给类型变量。

 */
public class Test1 {
    public static void main(String[] args){
        ArrayList<String> list1 = new ArrayList<>();
        ArrayList<Person> list2 = new ArrayList<>();
        ArrayList<Student> list3 = new ArrayList<>();
        ArrayList<JavaStudent> list4 = new ArrayList<>();
        ArrayList<UIStudent> list5 = new ArrayList<>();
        ArrayList<Teacher> list6 = new ArrayList<>();
        ArrayList<JavaTeacher> list7 = new ArrayList<>();
        ArrayList<UITeacher> list8 = new ArrayList<>();
        list1.add("A");
        list1.add("B");
        list1(list1);
    }
    //1.
    public static <T> void list1(ArrayList<T> list){
        for (Object o : list) {
            System.out.println(o);
        }
    }
    //2.
    public static void list2(ArrayList<? extends Person> list){
        for (Object o : list) {
            System.out.println(o);
        }
    }
    //3.
    public static void  list3(ArrayList<? extends Student> list){
        for (Object o : list) {
            System.out.println(o);
        }
    }
    //4.
    public static void  list4(ArrayList<? super JavaStudent> list){
        for (Object o : list) {
            System.out.println(o);
        }
    }
}

class Person{ }
class Student extends Person{ }
class Teacher extends Person{ }
class JavaStudent extends Teacher{ }
class UIStudent extends Teacher{ }
class JavaTeacher extends Teacher{ }
class UITeacher extends Teacher{ }







